Spark Streaming 两种读取 Kafka 方式

receiver 方式

/* 输入的四个参数分别代表着
* 1. zkQuorum :zookeeper地址
* 2. group:消费者所在的组
* 3. topics:该消费者所消费的topics
* 4. numThreads:开启消费topic线程的个数
*/
val Array(zkQuorum, group, topics, numThreads) = args

val sparkConf = new SparkConf().setAppName("KafkaWordCount")
val ssc = new StreamingContext(sparkConf, Seconds(1))

ssc.checkpoint(".")  //这里表示把检查点文件写入分布式文件系统HDFS,所以要启动Hadoop

// 将topics转换成topic-->numThreads的哈稀表
val topicMap = topics.split(",").map((_, numThreads.toInt)).toMap

// 创建连接 Kafka 的消费者链接
val lines = KafkaUtils.createStream(ssc, zkQuorum, group, topicMap).map(_._2)

val words = lines.flatMap(_.split(" "))  //将输入的每行用空格分割成一个个word
注意点:

在 Receiver 的方式中,Spark中的 partition 和 kafka 中的 partition 并不是相关的,
所以如果我们加大每个 topic 的 partition 数量,仅仅是增加线程来处理由单一Receiver消费的 Topic。
但是这并没有增加Spark在处理数据上的并行度.
对于不同的 Group 和 topic 我们可以使用多个Receiver创建不同的 Dstream 来并行接收数据,
之后可以利用 union 来统一成一个 Dstream

防止数据丢失:
可能因为 execture 、driver 死掉而丢失

增加(spark.streaming.receiver.writeAheadLog.enable=true)
KafkaUtils.createStream(…, StorageLevel.MEMORY_AND_DISK_SER)
减少数据丢失

参考:

Spark Streaming + Kafka整合
Spark Streaming 实时处理数据案例

Direct 方式

为了WAL的性能损失和exactly-once,spark streaming1.3中使用Kafka direct API。非常巧妙,Spark driver计算下个batch的offsets,指导executor消费对应的topics和partitions。消费Kafka消息,就像消费文件系统文件一样。



上面的过程直接看翻译,很清晰的~(periodically:周期的,query:查询,calculate:计算,offset:偏移量,ranges:范围,batch:批处理,在spark streaming 中表示一个个切片,consume:消费)

  1. 不再需要kafka receivers,executor直接通过Kafka API消费数据
  2. WAL不再需要,如果从失败恢复,可以重新消费
  3. exactly-once得到了保证,不会再从WAL中重复读取数据

创建DStream,返回接收到的输入数据

/* 输入的四个参数分别代表着
* topicSeq:topic列表
* kafkaParams:consumer 配置项
* fromOffsets:topic + partition 起始 offset,fromOffsets是可选的。
*/
var stream = KafkaUtils.createDirectStream(ssc, 
        PreferConsistent, Subscribe[String, String](topicSeq, kafkaParams, fromOffsets))
参考

Spark Streaming和Kafka集成深入浅出。(一些概念的介绍很好,还有:反压)
Spark Streaming 使用 Kafka 保证数据零丢失。(太吊了!强烈推荐仔细看!)

反压

如果在一个 batch 内收到的消息比较多,这就需要为 executor 分配更多内存,可能会导致其他spark streaming应用程序资源分配不足,甚至有OOM的风险。特别是第一次启动应用程序,从earliest offset消费数据时,kafka保留的历史消息越多,数据处理时间也就越长。反压可以限制每个batch接收到的消息量,降低数据倾斜的风险,开启反压:

SparkConf.set("spark.streaming.backpressure.enabled", "true")

设置每个kafka partition读取消息的最大速率:

SparkConf.set("spark.streaming.kafka.maxRatePerPartition", 
      "spark.streaming.kafka.maxRatePerPartition")

这个值要结合 spark Streaming 处理消息的速率和 batch Duration,尽量保证读取的每个 partition 数据在 batch Duration 时间内处理完,这个参数需要不断调整,以做到尽可能高的吞吐量.

两种方式优缺点:

receiver 保证数据不丢失,但是可能数据会重复消费
Direct 相比 Receiver 模式而言能够确保机制更加健壮. 区别于使用 Receiver 来被动接收数据, Direct 模式会周期性地主动查询 Kafka, 来获得每个 topic+partition 的最新的 offset, 从而定义每个 batch 的 offset 的范围. 当处理数据的 job 启动时, 就会使用 Kafka 的简单 consumer api 来获取 Kafka 指定 offset范围的数据。

receiver 对于多个分区需要增加多个 recevier 然后 union 使用
Direct 不需要创建多个输入 DStream 然后对它们进行 union 操作. Spark会创建跟Kafka partition一样多的RDD partition, 并且会并行从Kafka中读取数据. 所以在Kafka partition 和 RDD partition 之间, 有一个一对一的映射关系

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,387评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,845评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,091评论 0 246
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,308评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,662评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,795评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,008评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,466评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,687评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,181评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,531评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,177评论 3 239
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,126评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,862评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,734评论 2 274

推荐阅读更多精彩内容